package com.itcam.phaseiii.thread_;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * Author:Cammy.Wu
 * Date:2024-05-10
 * Description:
 */

public class ThreadDemo04 {
    /*
        开启线程的第三种方式，实现Callable接口

        1.编写一个类实现Callable接口
        2.重写call方法
        3.将线程任务代码写在call方法中
        4.创建线程任务资源对象
        5.创建线程任务对象，封装线程资源
        6.创建线程对象，传入线程任务
        7.使用线程对象调用start开启线程
     */
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建线程任务资源对象
        MyCallable myCallable = new MyCallable();
        // 创建线程任务对象，封装线程资源
        FutureTask<Integer> task = new FutureTask<>(myCallable);
        FutureTask<Integer> task1 = new FutureTask<>(myCallable);
        // 创建线程对象，传入线程任务
        Thread thread = new Thread(task);
        Thread thread1 = new Thread(task1);
        // 使用线程对象调用start开启线程
        thread.start();
        thread1.start();

        // 线程开起来了才能拿到结果
        Integer result = task.get();
        Integer result1 = task1.get();
        System.out.println("获取到的结果为："+result);
        System.out.println("获取到的结果为："+result1);
    }
}

// 1.编写一个类实现Callable接口
class MyCallable implements Callable{

    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    // 2.重写call方法
    @Override
    public Object call() throws Exception {
        // 3.将线程任务代码写在call方法中
        int sum=0;
        for (int i = 0; i <= 100; i++) {
            sum+=i;
            System.out.println("sum = " + sum);
        }
        return sum;
    }
}
